<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>DELETE</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-declare.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-declare.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-dropaggregate.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-dropaggregate.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-DELETE"></a>DELETE</h1>
<div class="REFNAMEDIV"><a name="AEN50240"></a><h2>名称</h2>DELETE&nbsp;--&nbsp;删除一个表中的行</div>
<a name="AEN50243"></a>
<div class="REFSYNOPSISDIV"><a name="AEN50245"></a><h2>语法</h2>
<pre class="SYNOPSIS">DELETE FROM [ ONLY ] <tt class="REPLACEABLE"><i>table</i></tt> [ [ AS ] <tt class="REPLACEABLE"><i>alias</i></tt> ]
    [ USING <tt class="REPLACEABLE"><i>usinglist</i></tt> ]
    [ WHERE <tt class="REPLACEABLE"><i>condition</i></tt> ]
    [ RETURNING * | <tt class="REPLACEABLE"><i>output_expression</i></tt> [ AS <tt class="REPLACEABLE"><i>output_name</i></tt> ] [, ...] ]</pre>
</div>
<div class="REFSECT1"><a name="AEN50253"></a><h2>描述</h2>
<p><tt class="COMMAND">DELETE</tt> 从指定的表里删除满足 <tt class="LITERAL">WHERE</tt> 子句的行。如果 <tt class="LITERAL">WHERE</tt> 子句不存在，将删除表中所有行。结果是一个有效的空表。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b> <a href="sql-truncate.html"><i>TRUNCATE</i></a> 是一个 PostgreSQL 扩展，它提供一个更快的从表中删除所有行的机制。</p>
</blockquote>
</div>
<p>缺省时 <tt class="COMMAND">DELETE</tt> 将删除所声明的表及其所有子表的记录。如果你希望只删除指定的表，你应该使用 <tt class="LITERAL">ONLY</tt> 子句。</p>
<p>使用数据库中其它表的信息删除某个表中的数据行有两个办法：使用子查询，或者在 <tt class="LITERAL">USING</tt> 子句中声明额外的表。哪种技巧更合适取决于特定的环境。</p>
<p>可选的 <tt class="LITERAL">RETURNING</tt> 子句将使得 <tt class="COMMAND">DELETE</tt> 计算并返回实际被删除了的行。任何使用表字段的表达式和/或 <tt class="LITERAL">USING</tt> 中提到的其他表的字段，都可以用于计算。<tt class="LITERAL">RETURNING</tt> 列表的语法和 <tt class="COMMAND">SELECT</tt> 输出列表的语法相同。</p>
<p>要对表进行删除，你必须对它有 <tt class="LITERAL">DELETE</tt> 权限，同样也必须有 <tt class="LITERAL">USING</tt> 子句的表以及 <tt class="REPLACEABLE"><i>condition</i></tt> 上读取的表的 <tt class="LITERAL">SELECT</tt> 权限。</p>
</div>
<div class="REFSECT1"><a name="AEN50279"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="LITERAL">ONLY</tt></dt>
<dd><p>如果声明了这个选项，则只从指定的表中删除数据行。否则从指定的表及其所有子表中的删除。</p></dd>
<dt><tt class="REPLACEABLE"><i>table</i></tt></dt>
<dd><p>一个现存表的名字(可以有模式修饰)</p></dd>
<dt><tt class="REPLACEABLE"><i>alias</i></tt></dt>
<dd><p>目标表的别名。如果提供了别名，那么它将完全掩盖实际的表名。例如给定 <tt class="LITERAL">DELETE FROM foo AS f</tt> 之后，<tt class="COMMAND">DELETE</tt> 语句的剩余部分必须使用 <tt class="LITERAL">f</tt> 而不是 <tt class="LITERAL">foo</tt> 来引用该表。</p></dd>
<dt><tt class="REPLACEABLE"><i>usinglist</i></tt></dt>
<dd><p>表表达式列表，允许来自其他表的列出现在 <tt class="LITERAL">WHERE</tt> 条件中。这与可以在 <tt class="COMMAND">SELECT</tt> 命令的 <a href="sql-select.html#SQL-FROM"><i><i>FROM</i> 子句</i></a> 中指定的表列表相似。例如，可以为该表的名字声明一个别名。不要在 <tt class="REPLACEABLE"><i>usinglist</i></tt> 里重复目标表，除非你希望产生一个自连接。</p></dd>
<dt><tt class="REPLACEABLE"><i>condition</i></tt></dt>
<dd><p>一个返回 <tt class="TYPE">boolean</tt> 值的表达式，用于判断哪些行需要被删除。</p></dd>
<dt><tt class="REPLACEABLE"><i>output_expression</i></tt></dt>
<dd><p>An expression to be computed and returned by the <tt class="COMMAND">DELETE</tt> command after each row is deleted.  The expression may use any column names of the <tt class="REPLACEABLE"><i>table</i></tt> or table(s) listed in <tt class="LITERAL">USING</tt>. Write <tt class="LITERAL">*</tt> to return all columns</p></dd>
<dt><tt class="REPLACEABLE"><i>output_name</i></tt></dt>
<dd><p>A name to use for a returned column</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN50330"></a><h2>输出</h2>
<p>成功时，<tt class="COMMAND">DELETE</tt> 命令返回形如</p>
<pre class="SCREEN">DELETE <tt class="REPLACEABLE"><i>count</i></tt></pre>
<p>的标签。<tt class="REPLACEABLE"><i>count</i></tt> 是被删除的行数。如果为 0 则表示没有行匹配 <tt class="REPLACEABLE"><i>condition</i></tt> ，这个不认为是错误。</p>
<p>如果 <tt class="COMMAND">DELETE</tt> 命令包含一个 <tt class="LITERAL">RETURNING</tt> 子句，那么其结果非常类似于 <tt class="COMMAND">SELECT</tt> 语句基于 <tt class="LITERAL">RETURNING</tt> 子句中包含的字段和值列表的结果，只是基于被删除的行进行计算而已。</p>
</div>
<div class="REFSECT1"><a name="AEN50344"></a><h2>注意</h2>
<p>PostgreSQL 允许你在 <tt class="LITERAL">WHERE</tt> 条件里引用其它表的字段，方法是在 <tt class="LITERAL">USING</tt> 子句里声明其它表。比如，要删除给出制片商制作的所有电影，可以</p>
<pre class="PROGRAMLISTING">DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';</pre>
<p>这里实际发生的事情是在 <tt class="STRUCTNAME">films</tt> 和 <tt class="STRUCTNAME">producers</tt> 之间的一个连接，然后所有成功连接的 <tt class="STRUCTNAME">films</tt> 行都标记为删除。这个语法不是标准的，更标准的语法是这么做：</p>
<pre class="PROGRAMLISTING">DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');</pre>
<p>有时候连接风格比子查询风格更容易写或者执行更快。</p>
</div>
<div class="REFSECT1"><a name="AEN50355"></a><h2>例子</h2>
<p>删除所有电影(films)但不删除音乐(musicals)：</p>
<pre class="PROGRAMLISTING">DELETE FROM films WHERE kind &lt;&gt; 'Musical';</pre>
<p>清空 <tt class="LITERAL">films</tt> 表：</p>
<pre class="PROGRAMLISTING">DELETE FROM films;</pre>
<p>从 tasks 表及其子表中删除，并返回所有被删除的行：</p>
<pre class="PROGRAMLISTING">DELETE FROM tasks WHERE status = 'DONE' RETURNING *;</pre>
</div>
<div class="REFSECT1"><a name="AEN50364"></a><h2>兼容性</h2>
<p>这条命令遵循 SQL 标准，但是 <tt class="LITERAL">USING</tt> 和 <tt class="LITERAL">RETURNING</tt> 子句是 PostgreSQL 的扩展。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-declare.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-dropaggregate.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">DECLARE</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">DROP AGGREGATE</td></tr>
</table>
</div>
</body></html>